const fs = require("fs");

const momentService = require("../service/moment.service");
const fileService = require("../service/file.service");
const labelService = require("../service/label.service");
const errorType = require("../constans/error-types");
const AuthParams = require("../utils/auth-params");
const { PICTURE_PATH } = require("../constans/file-path");

class MomentController {
  // 一，创建动态
  async create(ctx, next) {
    // 1. 获取数据（user_id , content）
    const userId = ctx.user.id;
    const content = ctx.request.body.content;
    ctx.AuthParams = AuthParams;
    ctx.AuthParams();
    if (!content) {
      const error = new Error(errorType.NOPARAMETER);
      return ctx.app.emit("error", error, ctx);
    }
    // 2. 将数据插入到数据库
    const result = await momentService.create(userId, content);
    ctx.body = result;
  }

  // 二，查询动态
  async detail(ctx, next) {
    // 1.获取数据（momentId）
    const momentId = ctx.params.momentId;
    // 2.根据id去查询这条数据
    const result = await momentService.getMomentById(momentId);
    ctx.body = result;
  }

  // 三，查询全部动态
  async list(ctx, next) {
    // 1.获取数据（offset/size）
    const { offset, size } = ctx.query;
    // 2.查询列表
    const result = await momentService.getMomentList(offset, size);
    ctx.body = result;
  }

  // 四，修改动态
  async update(ctx, next) {
    // 1.获取参数
    const { momentId } = ctx.params;
    const { content } = ctx.request.body;
    // 2.修改内容
    const result = await momentService.update(content, momentId);
    ctx.body = result;
  }

  // 五，删除动态
  async remove(ctx, next) {
    // 1.获取momentId
    const { momentId } = ctx.params;
    // 2.删除内容
    const result = await momentService.remove(momentId);
    ctx.body = result;
  }

  // 给动态添加标签
  async addLabels(ctx, next) {
    // 1.获取momentId
    const { labels } = ctx;
    const { momentId } = ctx.params;
    if (!labels) {
      const error = new Error(errorType.NOPARAMETER);
      return ctx.app.emit("error", error, ctx);
    }

    // 2.添加所有标签
    for (let label of labels) {
      // 2.1判断标签是否已经和动态有关系
      const isExist = await momentService.addLabel(momentId, label.id);
      if (!isExist) {
        await momentService.addLabel(momentId, label.id);
      }
    }
    ctx.body = "给动态添加标签";
  }

  // 动态配图服务
  async fileInfo(ctx, next) {
    let { filename } = ctx.params;
    const fileInfo = await fileService.getFileByFilename(filename);
    const { type } = ctx.query;
    const types = ["small", "middle", "large"];
    if (types.some((item) => item === type)) {
      filename = filename + "-" + type;
    }

    ctx.response.set("content-type", fileInfo.mimetype);
    ctx.body = fs.createReadStream(`${PICTURE_PATH}/${filename}`);
  }
}

module.exports = new MomentController();
